import Store from '@/store/index.js';
import Utils from '@/utils/index.js';
import Http from '@/http/index.js';
import Constants from '@/constants/index.js';


export default {

    // 设置应用使用历史
    setAppUseHistory(_type) {
        let _key = this.getProjectType() + 'AppUseHistory';
        let _d1 = localStorage.getItem(_key);
        let _d2 = []
        if (_d1) {
            _d1 = _d1.split(",")
            _d2 = _d1.filter(item => {
                return item != _type;
            })
        }
        _d2.unshift(_type);
        if (_d2.length > 3) {
            _d2.splice(3, 1)
        }
        localStorage.setItem(_key, _d2.join(","));
        this.getAppUseHistory();
    },

    getAppUseHistory() {
        let _key = this.getProjectType() + "AppUseHistory";
        let _d1 = localStorage.getItem(_key);
        if (_d1) {
            _d1 = _d1.split(",");
            let _list = [];
            _d1.forEach(iiitem => {
                Store.getters.get_appAuthList.forEach(item => {
                    item.list.forEach(iitem => {
                        if (iitem.appCode == iiitem) {
                            _list.push(iitem)
                        }
                    })
                })
            })
            Store.dispatch('set_appUseHistory', _list)
        }


    },



    // 设置系统菜单
    setSystemMenu(list) {
        Store.dispatch('set_systemMenu', list)
    },
    // 获取门店应用列表
    async getStoreAppList() {
        let _data = await Http.post({

            url: "store/public/apps",
            domain: "STORE_MAIN_DOMAIN",
        }, window);
        if (_data._ok) {
            return _data.data.tree

        } else {
            return [];
        }

    },
    // 获取站点应用列表
    async getSiteAppList() {
        let _data = await Http.post({
            url: "mall-site-portal/app/getUserAuthApp",
        }, window);
        if (_data._ok) {
            return _data.data

        } else {
            return [];
        }

    },
    // 获取用户授权应用
    async getAppAuthList() {
        let _list = [];
        if (this.getProjectType() == "site") {
            _list = await this.getSiteAppList();


            _list.push({
                name: "辅助功能",
                list: [{
                        title: "自定义表单",
                        subTitle: "灵活使用自定义表单，玩转信息收集",
                        icon: Vue.prototype.$STATIC_RESOURCE_DOMAIN + "images/icon-apps-fuzhu-zdybd.png",
                        appCode: "custom-form",
                    },
                    {
                        title: "海报设计",
                        subTitle: "推广商城、分销裂变，活动传播",
                        icon: Vue.prototype.$STATIC_RESOURCE_DOMAIN + "images/icon-apps-fuzhu-hbsj.png",
                        appCode: "share-poster",
                    },
                    {
                        title: "店铺装修",
                        subTitle: "个性装修，打造专属品牌",
                        icon: Vue.prototype.$STATIC_RESOURCE_DOMAIN + "images/icon-apps-fuzhu-dpzx.png",
                        appCode: "LINK_TYPE_APP",
                        linkData: {
                            path: "/site/deco/home",
                        },
                    },
                    {
                        title: "自提管理",
                        subTitle: "到店自提设置",
                        icon: Vue.prototype.$STATIC_RESOURCE_DOMAIN + "images/icon-apps-fuzhu-ztgl.png",
                        appCode: "LINK_TYPE_APP",
                        linkData: {
                            path: "/site/setting/pickUp",
                        },
                    },
                    {
                        title: "自定义资产",
                        subTitle: "多种资产类型，随心创建",
                        icon: Vue.prototype.$STATIC_RESOURCE_DOMAIN + "images/icon-apps-fuzhu-zdyzc.png",
                        appCode: "LINK_TYPE_APP",
                        linkData: {
                            path: "/site/property/list",
                        },
                    },
                    {
                        title: "评价助手",
                        subTitle: "管理商品评价，快捷回复",
                        icon: Vue.prototype.$STATIC_RESOURCE_DOMAIN + "images/icon-apps-fuzhu-pjzs.png",
                        appCode: "LINK_TYPE_APP",
                        linkData: {
                            path: "/site/goods/comment",
                        },
                    },
                    {
                        title: "素材中心",
                        subTitle: "管理图片、视频、音频素材",
                        icon: Vue.prototype.$STATIC_RESOURCE_DOMAIN + "images/icon-apps-fuzhu-sczx.png",
                        appCode: "LINK_TYPE_APP",
                        linkData: {
                            path: "/site/setting/material",
                        },
                    },
                    {
                        title: "下载中心",
                        subTitle: "资源下载，方便清晰",
                        icon: Vue.prototype.$STATIC_RESOURCE_DOMAIN + "images/icon-apps-fuzhu-xzzx.png",
                        appCode: "LINK_TYPE_APP",
                        linkData: {
                            path: "/site/download",
                        },
                    },
                    {
                        title: "操作日志",
                        subTitle: "操作记录，尽在掌握",
                        icon: Vue.prototype.$STATIC_RESOURCE_DOMAIN + "images/icon-apps-fuzhu-czrz.png",
                        appCode: "LINK_TYPE_APP",
                        linkData: {
                            path: "/site/setting/editLog",
                        },
                    },
                    {
                        title: "地址库",
                        subTitle: "设置订单发货、收货地址",
                        icon: Vue.prototype.$STATIC_RESOURCE_DOMAIN + "images/icon-apps-fuzhu-dzk.png",
                        appCode: "LINK_TYPE_APP",
                        linkData: {
                            path: "/site/setting/address",
                        },
                    },
                    {
                        title: "配送管理",
                        subTitle: "运费模板、快递管理、配送设置",
                        icon: Vue.prototype.$STATIC_RESOURCE_DOMAIN + "images/icon-apps-fuzhu-psgl.png",
                        appCode: "LINK_TYPE_APP",
                        linkData: {
                            path: "/site/setting/deliverset",
                        },
                    },

                ]
            })
            _list.push({
                name: "开放平台",
                list: [{
                    title: "前端文档",
                    subTitle: "开发帮助文档与开发规范",
                    icon: Vue.prototype.$STATIC_RESOURCE_DOMAIN + "images/icon-apps-open-front-doc.png",
                    appCode: "open-front-doc",
                }]
            })
        } else if (this.getProjectType() == "store") {
            _list = await this.getStoreAppList();
        }


        Store.dispatch('set_appAuthList', JSON.parse(JSON.stringify(_list)))
        // $AppsCenterList
    },
    // 子应用获取内部全局变量
    getAppGlobalData(_arr, _window) {
        let _l = _arr.split(".")
        let _d = _window.MicroAppConfiguration.props.appGlobalData;
        _l.forEach(item => {
            _d = Utils.optionalChain(_d, item)
        })
        if (Utils.isEmpty(_d)) {
            console.error("getAppGlobalData Error", _arr, undefined);
        }
        return _d;
    },
    // 子应用获取内部全局函数
    getAppGlobalFun(_arr, _params, _window) {
        let _l = _arr.split(".")
        let _d = _window.MicroAppConfiguration.props.appGlobalFun;
        _l.forEach(item => {
            if (_d[item]) {
                _d = _d[item](_params)
            } else {
                _d = false;
            }
        })
        return _d;
    },

    
    // 下载图片
    downLoadFile(url) {
        var a = document.createElement('a'); // 创建一个a节点插入的document
        var event = new MouseEvent('click') // 模拟鼠标click点击事件
        a.download = 'beautifulGirl' // 设置a节点的download属性值
        a.href = url; // 将图片的src赋值给a节点的href
        a.dispatchEvent(event) // 触发鼠标点击事件
    },
    mainOpenPage(params) {
        let _type = "push";
        if (params.type) {
            _type = params.type
        }
        console.error(params.url);
        Vue.prototype.$Router[_type](params.url)
    },
    // 复制文本
    copyText(data) {
        return new Promise((success, fail) => {
            const textarea = document.createElement('textarea')
            textarea.value = data
            textarea.readOnly = true
            document.body.appendChild(textarea)
            textarea.select()
            textarea.setSelectionRange(0, data.length)
            document.execCommand('copy')
            textarea.remove()
            success(data)
            this.messageSuccess('内容已复制')
        })
    },
    // 图片压缩
    // compressPhoto:compressPhoto,
    // 根据跳转类型获取跳转类型对象数据
    getLinkTypeOption(val_) {
        let _obj = null;
        Constants.linkToType.forEach(item => {
            if (val_ == item.value) {
                _obj = item
            }
        })
        return _obj
    },

    // 获取列表数据源
    // format_ 
    /**
     * 
     * @param {*} params_.domain 请求地址前缀
     * @param {*} params_.url 请求地址
     * @param {*} params_.format 是否格式化转换
     */
    async getSelectListSource(params_, window) {
        if (params_.format == undefined) {
            params_.format = true;
        }

        if (params_.domain == undefined) {
            params_.domain = ""
        }

        let _data = await Http.post({
            domain: params_.domain,
            url: params_.url,
            data: params_.data,
            // delayTime: 1000,
        }, window);
        if (_data._ok) {
            if (params_.format) {
                return this.reSelectTreeDataSource({
                    data: _data.data,
                });
            } else {
                return _data.data;
            }

        } else {
            return false;
        }
    },

    /**
     * 数据重组 用于treeTableBox tableBox 内自动生成的下来select 组件使用
     * @param {*} _param.data 数据源
     * @param {*} _param.label  自定义参数名 默认为 name 指定选项的值为选项对象的某个属性值
     * @param {*} _param.value  自定义参数名 默认为 id 指定选项标签为选项对象的某个属性值
     * @param {*} _param.children  自定义参数名 默认为 children 指定选项的子选项为选项对象的某个属性值
     */

    // /**
    //  * 数据重组 用于treeTableBox tableBox 内自动生成的下来select 组件使用
    //  * @param ()
    //  * @returns {
    // *     enlabel:"",  英文标题
    // *     label:"",    中文标题
    // *     value:'',    值
    // *     other:{},    其他备用
    // * }
    // */

    reSelectTreeDataSource(_param) {
        let _data = _param.data;
        let _label = _param.label ? _param.label : "name";
        let _value = _param.value ? _param.value : "id";
        let _children = _param.children ? _param.children : "children";
        let _d = [];
        for (let i = 0; i < _data.length; i++) {
            let _item = {
                label: _data[i][_label] + '',
                value: _data[i][_value] + '',
            };
            if (_data[i][_children]) {
                if (_data[i][_children].length > 0) {
                    _item[_children] = this.reSelectTreeDataSource({
                        data: _data[i][_children],
                        label: _label + '',
                        value: _value + '',
                    });
                }
            }
            _d.push(_item);
        }
        return _d;
    },


    // 过滤树，转成前端统一key命名
    givenTreeFilter(params_) {
        // 数据源
        let _data = params_.data;
        //  父级key对应
        let _parentKeys = params_.parentKeys;
        //  子集key对应
        let _subsetKeys = params_.subsetKeys;
        // 子集key名
        let _subsetName = params_.subsetName;
        let _d = [];
        _data.forEach(item => {
            let _p = {
                label: item[_parentKeys.label],
                value: item[_parentKeys.value],
                children: []
            };
            if (item[_subsetName]) {
                if (item[_subsetName].length > 0) {
                    item[_subsetName].forEach(iitem => {
                        _p.children.push({
                            label: iitem[_subsetKeys.label],
                            value: iitem[_subsetKeys.value],
                        })
                    })
                }
            }
            _d.push(_p);
        })
        return _d;
    },

    // 全局加载框
    setLoad(type) {
        let _num = Store.getters.get_baseLoadModal;
        if (typeof type == "boolean") {
            if (type) {
                _num += 1;
            } else {
                _num -= 1;
            }
            if (_num <= 0) {
                _num = 0;
            }
        } else if (typeof type == "number") {
            _num = type
        }
        Store.dispatch('set_baseLoadModal', _num);
    },
    //错误提示
    messageError(msg) {
        Vue.prototype.$message({
            message: msg,
            type: 'error',
            duration: 2000,
            center: true,
            showClose: true,
            customClass: "customClassMessageError",
        })
    },
    // 成功提示
    messageSuccess(msg) {
        Vue.prototype.$message({
            message: msg,
            type: 'success',
            duration: 2000,
            showClose: true,
            center: true,
            customClass: "customClassMessageSuccess",
        })
    },
    // 全局异常报错监控
    errorConsole(err, vm, info) {
        console.groupCollapsed("%c 全局异常报错监控 ", "background:#f23456; padding: 1px; border-radius:3px; color: #fff;", err.toString());
        console.log("%c err", "font-weight: bold; color: #35495E;", err);
        console.log("%c vm", "font-weight: bold; color: #35495E;", vm);
        console.log("%c info", "font-weight: bold; color: #35495E;", info);
        console.log("%c url", "font-weight: bold; color: #35495E;", window.location.href);
        console.log("%c                                                                                                                              ", "border-bottom:1px solid #aaa; margin-left:-22px;margin-bottom:-10px;");
        console.groupEnd();
        // console.error("全局异常报错监控", err, vm, info);
        let _log = sessionStorage.getItem("errorConsoleLog");
        if (_log) {
            _log = JSON.parse(_log);
        } else {
            _log = [];
        }
        _log.push({
            text: err.toString(),
            info: info,
            url: window.location.href,
        })
        sessionStorage.setItem("errorConsoleLog", JSON.stringify(_log));
    },
    // 获取地址栏参数
    getUrlParams(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
        var r = window.location.search.substr(1).match(reg);

        if (r != null) return unescape(r[2]);
        return null;
    },
    // 像跳转的路径添加sid等信息
    // 使用 {path:'index',query:{a:1,b:2}}
    toUrl(params_) {
        let _q = {}
        if (this.getProjectType() == 'site') {
            _q.sid = this.getSid();
        }
        if (!params_.query) {
            params_.query = {}
        }
        params_.query = {
            ..._q,
            ...params_.query
        }
        return params_;
    },
    // 设置页面标题
    setDocumentTitle(_v) {
        // document.title = _v;

    },

    toMoneyCount(v) {
        return "￥" + Utils.isMoneyQianfen(v - 0);
    },
    // 获取用户端访问链接
    getShopLocationUrl(params) {
        let _url = Vue.prototype.$USER_SHOP_URL + this.getSid();
        if (Utils.optionalChain(params, "path")) {
            _url += "#" + params.path;
        }
        if (Utils.optionalChain(params, "query")) {
            _url += "?" + Utils.urlEncode(params.query);
        }
        return _url
    },
    // 获取站点id
    getSid() {

        let _sid = undefined;
        if (this.getProjectType() == "site") {
            _sid = this.getUrlParams("sid");
        } else if (this.getProjectType() == "store") {
            _sid = this.getStorePlatformId()
        }
        // console.error("站点id", _sid)
        return _sid
    },
    // 前往登录
    toLogin() {
        this.mainOpenPage({
            url: '/' + this.getProjectType() + '/login',
            type: "replace"
        })
    },
    // 注销
    toLogout() {
        localStorage.removeItem(this.getProjectType() + "Token");
        this.toLogin();
    },
    // 设置门店id
    setStoreId(id_) {
        localStorage.setItem("storeId", id_);
    },
    // 获取门店id
    getStoreId() {
        return localStorage.getItem("storeId");
    },

    // 设置门店的站点id
    setStorePlatformId(id_) {
        localStorage.setItem("storePlatformId", id_);
    },
    // 获取门店的站点id
    getStorePlatformId() {
        return localStorage.getItem("storePlatformId");
    },
    // 设置项目linkType
    setSystemLinkType(id_) {
        localStorage.setItem("systemLinkType", id_);
    },
    // 获取项目linkType
    getSystemLinkType() {
        return localStorage.getItem("systemLinkType");
    },
    // 获取当前子项目信息
    getAppInfo() {
        // let _type = window.location.pathname.split("/")[1];
    },
    // 获取项目类型 admin | site | store
    getProjectType() {
        let _type = window.location.pathname.split("/")[1];
        // 如果是应用则判断 fromchannel 参数
        if (_type == "apps") {
            _type = this.getUrlParams("fromchannel");
        }
        if (_type == "store") {
            return "store"
        } else if (_type == "admin") {
            return "admin"
        } else if (_type == "site") {
            return "site"
        } else {
            console.error("未知类型子项目");
            return false
        }

    },

    // 设置token
    setToken(data_) {
        // 存储token 
        localStorage.setItem(this.getProjectType() + "Token", JSON.stringify({
            expiresIn: data_.expiresIn,
            token: data_.token,
            tokenHead: data_.tokenHead,
        }));
    },
    // 获取token
    getToken() {
        let _token = localStorage.getItem(this.getProjectType() + "Token");
        // token 不存在去登录
        if (_token) {
            return JSON.parse(_token);
        } else {
            return false;
        }
    },
    // 获取数据字典
    async getDictData(name_, type_, window) {
        let _data = await Http.post({
            // isLoading: false,
            url: "mall-admin/dict-data/listAll",
            data: {
                dictType: name_
            },
        }, window);
        if (_data._ok) {
            _data.data.forEach(item => {
                if (type_ == "Number") {
                    item.dictValue = item.dictValue - 0;

                }
            })
            return _data.data
        } else {
            return []
        }

    },
    // 主要用于 判断手机号
    validatePhone(rule, value, callback) {
        if (value !== "") {
            if (!Utils.isPhone(value)) {
                callback(new Error("手机号格式不合法"));
            } else {
                callback();
            }
        } else {
            callback(new Error("手机号不能为空"));
        }
    },
    // 主要用于 判断密码
    validatePassword(rule, value, callback) {
        if (value !== "") {
            if (!Utils.isPassword(value)) {
                callback(new Error("密码由8-20位大小写字母和数字的组成"));
            } else {
                callback();
            }
        } else {
            callback(new Error("密码不为空"));
        }
    },

    // 主要用于 销售价 判断是否数字 不可为空 不可小于0 可以小数两位
    validateMoney(rule, value, callback) {
        if (value !== "") {
            if ((/^\d+(\.\d{1,2})?$/).test(value) == false) {
                callback(new Error("限两位小数内正数"));
            } else {
                callback();
            }
        } else {
            callback(new Error("不能为空"));
        }
    },

    // 主要用于 成本价 市场价 判断是否数字 可为空 不可小于0 可以小数两位
    validatePrice(rule, value, callback) {
        if (value == null) {
            callback();
        } else if (value !== "") {
            if ((/^\d+(\.\d{1,2})?$/).test(value) == false) {
                callback(new Error("限两位小数内正数"));
            } else {
                callback();
            }
        } else {
            callback();
        }
    },
    // 主要用于库存 判断是否数字 不可为空 不可小于0 不可有小数
    validateStock(rule, value, callback) {
        if (value !== "") {
            if ((/^[0-9]\d*$/).test(value) == false) {
                callback(new Error("限正整数"));
            } else {
                callback();
            }
        } else {
            callback(new Error("不能为空"));
        }
    },

    // 主要用于库存加减 判断是否数字 不可为空 不可小于0 不可有小数
    validateCountStock(rule, value, callback) {
        if (value !== "") {
            if ((/^-?[0-9]\d*$/).test(value) == false) {
                callback(new Error("限正整数"));
            } else {
                callback();
            }
        } else {
            callback(new Error("不能为空"));
        }
    },

    // 主要用于 重量 体积 判断是否数字 可为空 不可小于0 可以小数三位
    validateVolume(rule, value, callback) {
        if (value == null) {
            callback();
        } else if (value !== "") {
            if ((/^\d+(\.\d{1,3})?$/).test(value) == false) {
                callback(new Error("限三位小数内正数"));
            } else {
                callback();
            }
        } else {
            callback();
        }
    },

    // 解析营业时间
    toWeekString(_list) {
        let _zString = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"];
        let _arrWeek = [];
        _list.forEach((item) => {
            let _weekArr = [];
            let _arrRange = this.toIndexRange(item.weekList);
            _arrRange.forEach((iitem) => {
                // 如果开始等于结束 为一个日
                if (iitem.start == iitem.end) {
                    _weekArr.push(_zString[iitem.end]);
                }
                // 如果开始等于结束-1 为两个日
                else if (iitem.start == iitem.end - 1) {
                    _weekArr.push(_zString[iitem.start] + "、" + _zString[iitem.end]);
                }
                // 其他为多个日
                else {
                    _weekArr.push(_zString[iitem.start] + "至" + _zString[iitem.end]);
                }
            });
            let _timeArr = [];
            item.timeArr.forEach((iitem) => {
                _timeArr.push(iitem.begin + "-" + iitem.end);
            });
            _arrWeek.push({
                week: _weekArr.join("、"),
                time: _timeArr.join("、"),
            });
        });
        return _arrWeek;
    },
    // 计算索引范围 如 [1,2,3,4,5,6,7,11,14,15,16] return[{start:1,end:7},{start:11,end:1},{start:14,end:16}]
    toIndexRange(a1) {
        let a3 = [];
        a1.forEach((item) => {
            if (a3.length <= 0) {
                a3.push({
                    start: item,
                    end: item,
                });
            } else {
                let _sub = a3[a3.length - 1];
                if (item == _sub.end + 1) {
                    _sub.end += 1;
                } else {
                    a3.push({
                        start: item,
                        end: item,
                    });
                }
            }
        });
        return a3;
    },




}